package window;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.apache.commons.io.FileUtils;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;




public class CodeGenerate {
	
	private static ReadTable readTable=new ReadTable();

	
	public static void generateToOracleFile(String entityPackage, String entityName, String tableName,
			String description,  String primaryKeyPolicy, String sequenceCode) {
		
		try {
				

			 // 获取数据 
			Collection<Map<String, String>> properties =(Collection<Map<String, String>>) readTable.readData(tableName);
			
			String className=readTable.formatFieldCapital(tableName);
			String classname=readTable.formatField(tableName);

		    String entityPackageUrl=readTable.genPackStr("D:\\Users\\ex-liuyonggang001\\workspace\\shop-mobile1.0.0\\src\\java\\",entityPackage);
		    
		    String modelPackageUrl=entityPackageUrl+"/dto";
		    String modelPackage=entityPackage + ".dto";
		    
		    String repositoryPackageUrl=entityPackageUrl+"/dao";
		    String repositoryPackage=entityPackage+ ".dao";
		    
		    String repositoryImplPackageUrl=repositoryPackageUrl+"/Impl";
		    String repositoryImplPackage=repositoryPackage+ ".Impl";
		    
		    String servicePackageUrl=entityPackageUrl+"/service";
		    String servicePackage=entityPackage + ".service";
		    
		    String serviceImplPackageUrl=servicePackageUrl+"/Impl";
		    String serviceImplPackage=servicePackage + ".Impl";
		    
			/********************************************dto*******************************************************/

			Map<String, Object> map = new HashMap<String, Object>();
			// 实体类包名 	com/entity
			map.put("packageUrl", modelPackageUrl);
			// 包名 			com.entity
			map.put("modelPackage", modelPackage);
			// 实体类名 		SysUser
			map.put("className", className);
			// 数据库表名 	sys_user
			map.put("tableName", tableName);
			// 描述			用户表
			map.put("description", description);
			// 属性
			map.put("properties", properties);
			// 类型
			map.put("type", "dto");
			
//		    genEntity(map);

			/***********************************************dto****************************************************/

//			/************************************************dao***************************************************/
//
//			map = new HashMap<String, Object>();
//			map.put("packageUrl", repositoryPackageUrl);
//			map.put("repositoryPackage", repositoryPackage);
//			map.put("modelPackage", modelPackage);
//			map.put("classname", classname);
//			map.put("className", className);
//			map.put("description", description+"数据处理层接口");
//			map.put("type", "dao");
//
//		    genEntity(map);
//
//			/************************************************dao***************************************************/
//		    
//		    /************************************************daoImpl***************************************************/
//
//			map = new HashMap<String, Object>();
//			map.put("packageUrl", repositoryImplPackageUrl);
//			map.put("repositoryImplPackage", repositoryImplPackage);
//			map.put("repositoryPackage", repositoryPackage);
//			map.put("modelPackage", modelPackage);
//			map.put("classname", classname);
//			map.put("className", className);
//			map.put("description", description+"数据处理层实现类");
//			map.put("type", "daoImpl");
//
//		    genEntity(map);
//
//			/************************************************daoImpl***************************************************/
//
//			/**************************************************service*************************************************/
//		    map = new HashMap<String, Object>();
//			map.put("packageUrl", servicePackageUrl);
//			map.put("servicePackage", servicePackage);
//			map.put("repositoryPackage", repositoryPackage);
//			map.put("modelPackage", modelPackage);
//			map.put("classname", classname);
//			map.put("className", className);
//			map.put("description", description+"业务处理层接口");
//			map.put("type", "service");
//
//		    genEntity(map);
//			
//			/**************************************************service*************************************************/
//
//		    /**************************************************serviceImpl*************************************************/
//		    map = new HashMap<String, Object>();
//			map.put("packageUrl", serviceImplPackageUrl);
//			map.put("serviceImplPackage", serviceImplPackage);
//			map.put("servicePackage", servicePackage);
//			map.put("repositoryPackage", repositoryPackage);
//			map.put("modelPackage", modelPackage);
//			map.put("classname", classname);
//			map.put("className", className);
//			map.put("description", description+"业务处理层实现类");
//			map.put("type", "serviceImpl");
//
//		    genEntity(map);
			
			/**************************************************serviceImpl*************************************************/
            
		} catch (Exception e) {
			e.printStackTrace();
		}
				
	}
	
	
	
	/**
	 * 生成文件
	 */
	public static void genEntity(Map<String, Object> map){
		try {
			 //生成输出到文件   
			String root =(String) map.get("packageUrl");  
			String className=(String) map.get("className");
			

			String type=(String) map.get("type");
			String classTemplate="upingan/"+type+"Template.ftl";
			
//			if(!"model".equals(type) ){
//				className=className+readTable.formatFieldCapital(type);
//			}
			
			if(!"dto".equals(type)){
				className=className+readTable.formatFieldCapital(type);
			}
			
			//获取模板文件  
			Configuration cfg = new Configuration();  
			cfg.setDirectoryForTemplateLoading(new File("template"));  
		    cfg.setObjectWrapper(new DefaultObjectWrapper());  
			cfg.setLocale(Locale.CHINA);
	        cfg.setDefaultEncoding("utf-8");
			Template template = cfg.getTemplate(classTemplate);  
			            
			// 生成输出到控制台   
			Writer out = new OutputStreamWriter(System.out);  
			template.process(map, out);  
			out.flush();  

			File fileDir = new File(root);  
			// 创建文件夹，不存在则创建  
			FileUtils.forceMkdir(fileDir);  
			// 指定生成输出的文件  
			File output = new File(fileDir + "/"+className+".java");  
			Writer writer = new FileWriter(output);  
			template.process(map, writer);  
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		}  
	}
	
	

	
	public static void generateToMysqlFile(String entityPackage, String entityName, String tableName,
			String description,  String primaryKeyPolicy, String sequenceCode) {
		
		try {
				

			 // 获取数据 
			Collection<Map<String, String>> properties =(Collection<Map<String, String>>) readTable.readData(tableName);
			
			String className=readTable.formatFieldCapital(tableName);
			String classname=readTable.formatField(tableName);

		    String entityPackageUrl=readTable.genPackStr("src",entityPackage);
		    
		    String modelPackageUrl=entityPackageUrl+"/model";
		    String modelPackage=entityPackage + ".model";
		    
		    String repositoryPackageUrl=entityPackageUrl+"/repository/gps";
		    String repositoryPackage=entityPackage + ".repository.gps";
		    
		    String servicePackageUrl=entityPackageUrl+"/service/gps";
		    String servicePackage=entityPackage + ".service.gps";
		    
			/********************************************model*******************************************************/

			Map<String, Object> map = new HashMap<String, Object>();
			
			// 实体类包名 	com/entity
			map.put("packageUrl", modelPackageUrl);
			// 包名 			com.entity
			map.put("modelPackage", modelPackage);
			// 实体类名 		SysUser
			map.put("className", className);
			// 数据库表名 	sys_user
			map.put("tableName", tableName);
			// 描述			用户表
			map.put("description", description);
			// 属性
			map.put("properties", properties);
			// 类型
			map.put("type", "model");
			
		    genEntity(map);

			/***********************************************model****************************************************/

			/************************************************repository***************************************************/

			map = new HashMap<String, Object>();
			map.put("packageUrl", repositoryPackageUrl);
			map.put("repositoryPackage", repositoryPackage);
			map.put("modelPackage", modelPackage);
			map.put("className", className);
			map.put("description", description+"数据处理层");
			map.put("type", "repository");

		    genEntity(map);

			/************************************************repository***************************************************/

			/**************************************************service*************************************************/
		    map = new HashMap<String, Object>();
			map.put("packageUrl", servicePackageUrl);
			map.put("servicePackage", servicePackage);
			map.put("repositoryPackage", repositoryPackage);
			map.put("modelPackage", modelPackage);
			map.put("className", className);
			map.put("classname", classname);
			map.put("description", description+"业务处理层");
			map.put("type", "service");

		    genEntity(map);
			
			/**************************************************service*************************************************/

		    
            
		} catch (Exception e) {
			e.printStackTrace();
		}
				
	}
	

}
